package com.summer.ioc.concept;

public class Client {
	//下面3个方法，模拟了3种情况，其内并无直接联系。。todo描述正常的业务代码，todo1描述使用代理委托，todoIOC描述IOC思想
	public void todo(){
		//一般权责讲的就是一个方法内实现的代码锁做的事，
		//权责转移是指需求分析时，原本我们规定某个对象方法改处理的事，他不处理了，不写那些代码了，而是引用了另一个对象调用其处理方法。委托出去
		//自己做了这件事，权责在自己。原始的处理方式
		System.out.println("做了某件事");
	}
	
	public void todo1(){
		//代理与委托，Client代理了这件事，并委托给Service，检查权责在代理，执行权责在服务
		//这里Client 的职责是负责生产服务并转发委托。
		//Service 则是去做具体的事.
		Service service = new Service();
		service.doService();
	}
	
	Service mService;
	public void todoIoc(){
		//这里就是IOC思想的核心了，依赖注入，原本Service的生产应该是Client需要做的是，但是交给了第三方Factory去处理了
		//对于Client而言Service的生产是完全不知道怎么进行的。那么原本Client职责转移给了Factory，控制权也由Client转移给了Factory
		//这就是控制反转IOC。权限由Client转移给Factory，Factory处理完后再转移回Client，实现了反转。
		//乍一看，可能觉得这个好像没什么用，那么IOC能做什么后面具体结合实际再讲，
		//这里容易搞混的是IOC转交出去的是控制权限，但是好像就做了一个赋值的操作，和工厂赋值没什么区别一样。
		//其实并不是那样，IOC 和 工厂赋值，或者查询赋值，直接赋值的区别就是在于这里，真正的赋值并不是在Client内部完成的。
		//而是在Factory第三方里完成的，这就想是Factory建了一个对象，然后注入到Client内部来的，而非Client主动发起的赋值。
		//因为是这样，所以这让以后IOC板块可以很灵活，Client不用关心究竟是去执行了什么，其他地方也不用担心Client究竟能不能执行我要的方法，
		//因为你都可以从外部注入进来。这里所讲只是思想，具体优化的模型后面会讲
		
		mService.doService();
	}
	
	public void setService(Service service){
		this.mService = service;
	}
	
	public static void main(String[] args) {
		Client client = new Client();
		client.todo();
		client.todo1();
		Factory.injection(client);
		client.todoIoc();
	}
	
}
